source('../settings/settings.R')
source('commonFunctions.R')
persons <- SELECTED_SUBJECTS
all_Drive2 <- read.csv('..//data/processed/distancewise/TT1_Drive_2_30m_30m.csv')
all_Drive2$Subject <- as.factor(all_Drive2$Subject)
all_Drive2$logPerspiration <- log(all_Drive2$Perspiration)
mean_pp <- vector(mode="list", length=length(persons))
names(mean_pp) <- persons
mean_pp_max <- vector(mode="list", length=length(persons))
names(mean_pp_max) <- persons
std_pp <- vector(mode="list", length=length(persons))
names(std_pp) <- persons
# Segments
mean_pp_seg0 <- vector(mode="list", length=length(persons))
names(mean_pp_seg0) <- persons
mean_pp_seg1 <- vector(mode="list", length=length(persons))
names(mean_pp_seg1) <- persons
mean_pp_seg2 <- vector(mode="list", length=length(persons))
names(mean_pp_seg2) <- persons
mean_pp_seg3 <- vector(mode="list", length=length(persons))
names(mean_pp_seg3) <- persons
mean_pp_seg4 <- vector(mode="list", length=length(persons))
names(mean_pp_seg4) <- persons
for(p in persons) {
pData <- all_Drive2[(all_Drive2$Subject==as.integer(p) | all_Drive2$Subject==p),]
pData_act2 <- pData[pData$Activity==2,]
pData_seg0 <- pData[pData$Phase==0,]
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==2 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==2 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==2 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==2,]
mean_pp[[p]] <- mean(pData_act2$ppLogNormalized)
std_pp[[p]] <- sd(pData$ppLogNormalized)
mean_pp_seg0[[p]] <- mean(pData_seg0$ppLogNormalized)
mean_pp_seg1[[p]] <- mean(pData_seg1$ppLogNormalized)
mean_pp_seg2[[p]] <- mean(pData_seg2$ppLogNormalized)
mean_pp_seg3[[p]] <- mean(pData_seg3$ppLogNormalized)
mean_pp_seg4[[p]] <- mean(pData_seg4$ppLogNormalized)
mean_pp_max[[p]] <- max(mean_pp_seg1[[p]], mean_pp_seg2[[p]], mean_pp_seg3[[p]], mean_pp_seg4[[p]])
}
plt_AllAcc <- vector(mode="list", length=length(persons))
names(plt_AllAcc) <- persons
COLOR_ACC = "#02A3C8"
COLOR_PP = "#F28E8E"
COLOR_BRAKE = "#888888"
y1 <- list(
tickfont = list(color = COLOR_ACC),
title="Degree",
range=c(0, max(all_Drive2$Acceleration))
)
y2 <- list(
tickfont = list(color = COLOR_PP),
overlaying = "y",
side = "right",
title = "Log Perspiration",
showgrid = FALSE,
range=c(-0.6, 0.9)
# range=c(min(all_Drive2$ppLogNormalized), max(all_Drive2$ppLogNormalized))
)
for (p in persons) {
pData <- all_Drive2[(all_Drive2$Subject==as.integer(p) | all_Drive2$Subject==p),]
pData_seg0 <- pData[pData$Phase==0,]
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==2 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==2 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==2 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==2,]
plot_Acc <- plot_ly(pData, x = ~Time, height=400, width=900) %>%
# add_trace(name="Acceleration", y = ~Acceleration, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_ACC)) %>%
add_trace(name="PP", y = ~ppLogNormalized, type = 'scatter', mode = 'lines', connectgaps=F, line=list(width=1.5, color=COLOR_PP), yaxis = "y2") %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp[[p]], yend = mean_pp[[p]],
yaxis = "y2", name="Avg. PP (straight)",
line=list(color="darkgray", dash = 'dot')) %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp_seg0[[p]], yend = mean_pp_seg0[[p]],
yaxis = "y2", name="Avg. PP (turning)",
line=list(color="black", dash = 'dot')) %>%
add_segments(x = min(pData_seg1$Time), xend = max(pData_seg1$Time), y = mean_pp_seg1[[p]], yend = mean_pp_seg1[[p]],
yaxis = "y2", name="Avg. PP (1st part)",
line=list(color="red", dash = 'dot')) %>%
add_segments(x = min(pData_seg2$Time), xend = max(pData_seg2$Time), y = mean_pp_seg2[[p]], yend = mean_pp_seg2[[p]],
yaxis = "y2", name="Avg. PP (2nd part)",
line=list(color="green", dash = 'dot')) %>%
add_segments(x = min(pData_seg3$Time), xend = max(pData_seg3$Time), y = mean_pp_seg3[[p]], yend = mean_pp_seg3[[p]],
yaxis = "y2", name="Avg. PP (3rd part)",
line=list(color="blue", dash = 'dot')) %>%
add_segments(x = min(pData_seg4$Time), xend = max(pData_seg4$Time), y = mean_pp_seg4[[p]], yend = mean_pp_seg4[[p]],
yaxis = "y2", name="Avg. PP (4th part)",
line=list(color="purple", dash = 'dot')) %>%
layout(
title=paste0("Subject #", p),
xaxis=list(title="Time [s]", range=c(0)),
yaxis=y1,
yaxis2=y2,
margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4),
legend = list(x = 0.5, xanchor = "center", y = 0.2, bgcolor = "rgba(0,0,0,0)", title="Metric", orientation = "h"),
autosize = F
)
plt_AllAcc[[p]] <- plot_Acc
}
htmltools::tagList(plt_AllAcc)
NUMBER_OF_CLUSTERS = 3
color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
dfPP <- as.data.frame(cbind(
unlist(mean_pp),
unlist(std_pp),
unlist(mean_pp_seg0),
unlist(mean_pp_seg1),
unlist(mean_pp_seg2),
unlist(mean_pp_seg3),
unlist(mean_pp_seg4),
unlist(mean_pp_max)))
names(dfPP) <- c("MeanPP", "StdPP", "MeanPP_Seg0", "MeanPP_Seg1", "MeanPP_Seg2", "MeanPP_Seg3", "MeanPP_Seg4", "MeanPP_SegMax")
behavioralMatrixClustering <- as.matrix(dfPP)
distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust
hc <- hresults %>%
as.dendrogram %>%
set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
# set("leaves_pch", 19) %>%
# set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%
set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)
plot(hc)
legend("topright",
title="Drive=Cognitive \nHierachical Clustering",
legend = c("Group 1", "Group 2", "Group 3"),
col = c("darkred", "pink" , "blue"),
pch = c(20,20,20), bty = "n", pt.cex = 1.5, cex = 0.8 ,
text.col = "black", horiz = FALSE, inset = c(0.4, 0.1))

# Store clustering data
fPath <- str_interp("../data/processed/analysis/TT1_Drive_2_PP.csv")
dfx <- dfPP
dfx <- cbind(persons, dfx)
names(dfx) <- c("Subject", names(dfPP))
write.csv(dfx, fPath, row.names = F)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpwZXJzb25zIDwtIFNFTEVDVEVEX1NVQkpFQ1RTCgphbGxfRHJpdmUyIDwtIHJlYWQuY3N2KCcuLi8vZGF0YS9wcm9jZXNzZWQvZGlzdGFuY2V3aXNlL1RUMV9Ecml2ZV8yXzMwbV8zMG0uY3N2JykKYWxsX0RyaXZlMiRTdWJqZWN0IDwtIGFzLmZhY3RvcihhbGxfRHJpdmUyJFN1YmplY3QpCmFsbF9Ecml2ZTIkbG9nUGVyc3BpcmF0aW9uIDwtIGxvZyhhbGxfRHJpdmUyJFBlcnNwaXJhdGlvbikKYGBgCgoKYGBge3J9Cm1lYW5fcHAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcCkgPC0gcGVyc29ucwoKbWVhbl9wcF9tYXggPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9tYXgpIDwtIHBlcnNvbnMKCnN0ZF9wcCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhzdGRfcHApIDwtIHBlcnNvbnMKCiMgU2VnbWVudHMKbWVhbl9wcF9zZWcwIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMCkgPC0gcGVyc29ucwptZWFuX3BwX3NlZzEgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWcxKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnMiA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzIpIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWczIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMykgPC0gcGVyc29ucwptZWFuX3BwX3NlZzQgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWc0KSA8LSBwZXJzb25zCgoKZm9yKHAgaW4gcGVyc29ucykgewogIHBEYXRhIDwtIGFsbF9Ecml2ZTJbKGFsbF9Ecml2ZTIkU3ViamVjdD09YXMuaW50ZWdlcihwKSB8IGFsbF9Ecml2ZTIkU3ViamVjdD09cCksXQogIHBEYXRhX2FjdDIgPC0gcERhdGFbcERhdGEkQWN0aXZpdHk9PTIsXQogIAogIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIHBEYXRhX3NlZzEgPC0gcERhdGFbcERhdGEkUGhhc2U9PTEgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAxMTAsXQogIHBEYXRhX3NlZzIgPC0gcERhdGFbcERhdGEkUGhhc2U9PTIgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAyNTAsXQogIHBEYXRhX3NlZzMgPC0gcERhdGFbcERhdGEkUGhhc2U9PTMgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAzNTAsXQogIHBEYXRhX3NlZzQgPC0gcERhdGFbcERhdGEkUGhhc2U9PTQgJiBwRGF0YSRBY3Rpdml0eT09MixdCiAgCiAgbWVhbl9wcFtbcF1dIDwtIG1lYW4ocERhdGFfYWN0MiRwcExvZ05vcm1hbGl6ZWQpCiAgc3RkX3BwW1twXV0gPC0gc2QocERhdGEkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnMFtbcF1dIDwtIG1lYW4ocERhdGFfc2VnMCRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWcxW1twXV0gPC0gbWVhbihwRGF0YV9zZWcxJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzJbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzIkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnM1tbcF1dIDwtIG1lYW4ocERhdGFfc2VnMyRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWc0W1twXV0gPC0gbWVhbihwRGF0YV9zZWc0JHBwTG9nTm9ybWFsaXplZCkKICAKICBtZWFuX3BwX21heFtbcF1dIDwtIG1heChtZWFuX3BwX3NlZzFbW3BdXSwgbWVhbl9wcF9zZWcyW1twXV0sIG1lYW5fcHBfc2VnM1tbcF1dLCBtZWFuX3BwX3NlZzRbW3BdXSkKfQoKYGBgCgpgYGB7cn0KcGx0X0FsbEFjYyA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhwbHRfQWxsQWNjKSA8LSBwZXJzb25zCgpDT0xPUl9BQ0MgPSAiIzAyQTNDOCIKQ09MT1JfUFAgPSAiI0YyOEU4RSIKQ09MT1JfQlJBS0UgPSAiIzg4ODg4OCIKCnkxIDwtIGxpc3QoCiAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gQ09MT1JfQUNDKSwKICB0aXRsZT0iRGVncmVlIiwKICByYW5nZT1jKDAsIG1heChhbGxfRHJpdmUyJEFjY2VsZXJhdGlvbikpCikKeTIgPC0gbGlzdCgKICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBDT0xPUl9QUCksCiAgb3ZlcmxheWluZyA9ICJ5IiwKICBzaWRlID0gInJpZ2h0IiwKICB0aXRsZSA9ICJMb2cgUGVyc3BpcmF0aW9uIiwKICBzaG93Z3JpZCA9IEZBTFNFLAogIHJhbmdlPWMoLTAuNiwgMC45KQogICMgcmFuZ2U9YyhtaW4oYWxsX0RyaXZlMiRwcExvZ05vcm1hbGl6ZWQpLCBtYXgoYWxsX0RyaXZlMiRwcExvZ05vcm1hbGl6ZWQpKQopCgpmb3IgKHAgaW4gcGVyc29ucykgewogIHBEYXRhIDwtIGFsbF9Ecml2ZTJbKGFsbF9Ecml2ZTIkU3ViamVjdD09YXMuaW50ZWdlcihwKSB8IGFsbF9Ecml2ZTIkU3ViamVjdD09cCksXQogIAogIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIHBEYXRhX3NlZzEgPC0gcERhdGFbcERhdGEkUGhhc2U9PTEgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAxMTAsXQogIHBEYXRhX3NlZzIgPC0gcERhdGFbcERhdGEkUGhhc2U9PTIgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAyNTAsXQogIHBEYXRhX3NlZzMgPC0gcERhdGFbcERhdGEkUGhhc2U9PTMgJiBwRGF0YSRBY3Rpdml0eT09MiAmIHBEYXRhJFRpbWUgPCAzNTAsXQogIHBEYXRhX3NlZzQgPC0gcERhdGFbcERhdGEkUGhhc2U9PTQgJiBwRGF0YSRBY3Rpdml0eT09MixdCiAgCiAgcGxvdF9BY2MgPC0gcGxvdF9seShwRGF0YSwgeCA9IH5UaW1lLCBoZWlnaHQ9NDAwLCB3aWR0aD05MDApICU+JQogICAgIyBhZGRfdHJhY2UobmFtZT0iQWNjZWxlcmF0aW9uIiwgeSA9IH5BY2NlbGVyYXRpb24sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBsaW5lPWxpc3Qod2lkdGg9MS41LCBjb2xvcj1DT0xPUl9BQ0MpKSAlPiUgCiAgICBhZGRfdHJhY2UobmFtZT0iUFAiLCB5ID0gfnBwTG9nTm9ybWFsaXplZCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGNvbm5lY3RnYXBzPUYsIGxpbmU9bGlzdCh3aWR0aD0xLjUsIGNvbG9yPUNPTE9SX1BQKSwgeWF4aXMgPSAieTIiKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcFtbcF1dLCB5ZW5kID0gbWVhbl9wcFtbcF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKHN0cmFpZ2h0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya2dyYXkiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcwW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzBbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAodHVybmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImJsYWNrIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWcxJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzEkVGltZSksIHkgPSBtZWFuX3BwX3NlZzFbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnMVtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICgxc3QgcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InJlZCIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMiRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWcyJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcyW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzJbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoMm5kIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJncmVlbiIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMyRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWczJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWczW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzNbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoM3JkIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWc0JFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzQkVGltZSksIHkgPSBtZWFuX3BwX3NlZzRbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnNFtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICg0dGggcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InB1cnBsZSIsIGRhc2ggPSAnZG90JykpICU+JQogICAgbGF5b3V0KAogICAgICB0aXRsZT1wYXN0ZTAoIlN1YmplY3QgIyIsIHApLCAKICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iVGltZSBbc10iLCByYW5nZT1jKDApKSwgCiAgICAgIHlheGlzPXkxLCAKICAgICAgeWF4aXMyPXkyLCAKICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDUwLCB0ID0gNTAsIHBhZCA9IDQpLAogICAgICBsZWdlbmQgPSBsaXN0KHggPSAwLjUsIHhhbmNob3IgPSAiY2VudGVyIiwgeSA9IDAuMiwgYmdjb2xvciA9ICJyZ2JhKDAsMCwwLDApIiwgdGl0bGU9Ik1ldHJpYyIsIG9yaWVudGF0aW9uID0gImgiKSwKICAgICAgYXV0b3NpemUgPSBGCiAgICApCiAgCiAgcGx0X0FsbEFjY1tbcF1dIDwtIHBsb3RfQWNjCn0KCgpodG1sdG9vbHM6OnRhZ0xpc3QocGx0X0FsbEFjYykKYGBgCgoKYGBge3J9Ck5VTUJFUl9PRl9DTFVTVEVSUyA9IDMKCmNvbG9yX2RhcmtwaW5rID0gIiNlNzU0ODAiCkNMVVNURVJfQlJBTkNIX0NPTE9SUyA8LSBjKCJibHVlIiwgImRhcmtyZWQiLCBjb2xvcl9kYXJrcGluaywgImJsYWNrIilbMTpOVU1CRVJfT0ZfQ0xVU1RFUlNdCkNMVVNURVJfTEFCRUxfQ09MT1JTIDwtIGMoImJsdWUiLCAiZGFya3JlZCIsIGNvbG9yX2RhcmtwaW5rLCAiYmxhY2siKVsxOk5VTUJFUl9PRl9DTFVTVEVSU10KCgpkZlBQIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KHN0ZF9wcCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnMyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHBfc2VnNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QobWVhbl9wcF9tYXgpKSkKCm5hbWVzKGRmUFApIDwtIGMoIk1lYW5QUCIsICJTdGRQUCIsICJNZWFuUFBfU2VnMCIsICJNZWFuUFBfU2VnMSIsICJNZWFuUFBfU2VnMiIsICJNZWFuUFBfU2VnMyIsICJNZWFuUFBfU2VnNCIsICJNZWFuUFBfU2VnTWF4IikKYmVoYXZpb3JhbE1hdHJpeENsdXN0ZXJpbmcgPC0gYXMubWF0cml4KGRmUFApCgpkaXN0TWF0cml4IDwtIGRpc3QoYmVoYXZpb3JhbE1hdHJpeENsdXN0ZXJpbmcpCmhyZXN1bHRzIDwtIGRpc3RNYXRyaXggJT4lIGhjbHVzdAoKaGMgPC0gaHJlc3VsdHMgJT4lIAogICAgICBhcy5kZW5kcm9ncmFtICU+JQogICAgICBzZXQoIm5vZGVzX2NleCIsIE5VTUJFUl9PRl9DTFVTVEVSUykgJT4lCiAgICAgIHNldCgibGFiZWxzX2NvbCIsIHZhbHVlID0gQ0xVU1RFUl9MQUJFTF9DT0xPUlMsIGs9TlVNQkVSX09GX0NMVVNURVJTKSAlPiUKICAgICAgIyBzZXQoImxlYXZlc19wY2giLCAxOSkgJT4lCiAgICAgICMgc2V0KCJsZWF2ZXNfY29sIiwgdmFsdWUgPSBjKCJncmF5IiksIGs9TlVNQkVSX09GX0NMVVNURVJTKSAlPiUgICAgCiAgICAgIHNldCgiYnJhbmNoZXNfa19jb2xvciIsIHZhbHVlPUNMVVNURVJfQlJBTkNIX0NPTE9SUywgaz1OVU1CRVJfT0ZfQ0xVU1RFUlMpCgpwbG90KGhjKQpsZWdlbmQoInRvcHJpZ2h0IiwgCiAgICAgdGl0bGU9IkRyaXZlPUNvZ25pdGl2ZSBcbkhpZXJhY2hpY2FsIENsdXN0ZXJpbmciLAogICAgIGxlZ2VuZCA9IGMoIkdyb3VwIDEiLCAiR3JvdXAgMiIsICJHcm91cCAzIiksCiAgICAgY29sID0gYygiZGFya3JlZCIsICJwaW5rIiAsICJibHVlIiksCiAgICAgcGNoID0gYygyMCwyMCwyMCksIGJ0eSA9ICJuIiwgIHB0LmNleCA9IDEuNSwgY2V4ID0gMC44ICwgCiAgICAgdGV4dC5jb2wgPSAiYmxhY2siLCBob3JpeiA9IEZBTFNFLCBpbnNldCA9IGMoMC40LCAwLjEpKQpgYGAKCgoKYGBge3J9CiMgU3RvcmUgY2x1c3RlcmluZyBkYXRhCmZQYXRoIDwtIHN0cl9pbnRlcnAoIi4uL2RhdGEvcHJvY2Vzc2VkL2FuYWx5c2lzL1RUMV9Ecml2ZV8yX1BQLmNzdiIpCmRmeCA8LSBkZlBQCmRmeCA8LSBjYmluZChwZXJzb25zLCBkZngpCm5hbWVzKGRmeCkgPC0gYygiU3ViamVjdCIsIG5hbWVzKGRmUFApKQp3cml0ZS5jc3YoZGZ4LCBmUGF0aCwgcm93Lm5hbWVzID0gRikKYGBgCgoKCg==